package com.hhxy.service;

import com.alibaba.fastjson.JSON;
import com.hhxy.mapper.BrandMapper;
import com.hhxy.pojo.Brand;
import com.hhxy.pojo.PageBean;
import com.hhxy.utils.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.List;
import java.util.regex.Pattern;

public class BrandServiceImp implements BrandService {
    //1、通过工具类获取SqlSessionFactory对象
    SqlSessionFactory sqlSF = SqlSessionFactoryUtil.getSqlSF();

    /*查询所有功能*/
    /**
     * 查询所有
     */
    @Override
    public List<Brand> selectAll() {
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        BrandMapper mapper = sqlS.getMapper(BrandMapper.class);
        //4、执行SQL语句
        List<Brand> brands = mapper.selectAll();
        //5、释放资源
        sqlS.close();

        return brands;
    }

    /*新增品牌功能*/
    /**
     * 添加数据
     */
    @Override
    public int add(Brand brand) {
        /*System.out.println(brand);//测试*/
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        BrandMapper mapper = sqlS.getMapper(BrandMapper.class);
        //4、执行SQL语句

        //利用反射判断用户是否有空的输入，如果有则给予警告
        Class brandClass = brand.getClass(); // 得到类对象
        Field fields[] = brandClass.getDeclaredFields(); //得到所有属性
        for (Field field : fields) {
            field.setAccessible(true);//暴力反射，去掉private的阻碍
            Object fieldValue = null;
            try {
                fieldValue = field.get(brand); //得到属性值
                /*System.out.println(fieldValue);//测试*/
                String fieldName = field.getName(); // 得到属性名
//                Type fieldType =field.getGenericType();//得到属性类型
                if (!"id".equals(fieldName)) {
                    //要排除id，因为id是数据库给的，不需要用户输入
                    if (fieldValue == null || fieldValue == "") {  //一旦有一个为空就立马返回0，以示警告
                        /*System.out.println(",属性名："+fieldName+",属性值："+fieldValue);//测试*/
                        return 0;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /* 这一步是多余的，因为这部分工作是交给前端去做的，我纯粹是写着好玩的
        //利用正则表达式判断用户在排序框中的输入是否合法（就算写了也没有，因为输入非数字，在servlet那里就已经报错了）
        Pattern pattern = Pattern.compile("[0-9]*");
        if (!pattern.matcher(brand.getOrdered() + "").matches()) {
            //如果用户在排序输入框中输入的不是数字,报错
            return -1;
        }
        */
        int flag = mapper.add(brand);//用户输入没问题，将数据添加到数据库中，返回1
        sqlS.commit();//切记添加数据一定要记得提交事物，要么就直接设置自动提交
        //5、释放资源
        sqlS.close();
        return flag;
    }

    /*批量删除功能*/
    /**
     * 批量删除数据
     */
    @Override
    public void deleteByIds(int[] ids) {
        //2、获取SQLSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        BrandMapper mapper = sqlS.getMapper(BrandMapper.class);
        //4、执行SQL
        mapper.deleteByIds(ids);
        sqlS.commit();//切记！非查询需要提交事物
        //5、释放资源
        sqlS.close();
    }

    /*分页查询功能*/
    /**
     * 分页查询
     * @param currentPage 当前页码
     * @param pageSize 每页展示的记录数
     * @return PageBean对象，当中封装了总共记录数，和每页的记录
     */
    @Override
    public PageBean<Brand> selectByPage(int currentPage, int pageSize) {
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        BrandMapper mapper = sqlS.getMapper(BrandMapper.class);

        //4、执行SQL
        //4.1 计算起始索引
        int begin = (currentPage-1)*pageSize;
        //4.2 查询并获取当前页面的记录
        List<Brand> rows = mapper.selectByPage(begin, pageSize);
        //4.3 查询表中的总记录数
        int totalCount = mapper.selectTotalCount();

        //5、处理结果，将数据进行封装然后返回
        PageBean<Brand> pageBean = new PageBean<>(totalCount,rows);

        //6、释放资源
        sqlS.close();

        return pageBean;
    }

    /**
     * 分页条件查询
     * @param currentPage
     * @param pageSize
     * @param brand
     * @return
     */
    @Override
    public PageBean<Brand> selectByPageAndCondition(int currentPage, int pageSize, Brand brand) {
        //2、获取SqlSession对象
        SqlSession sqlS = sqlSF.openSession();
        //3、获取Mapper接口对象
        BrandMapper mapper = sqlS.getMapper(BrandMapper.class);
        //4、执行SQL，获取数据
        //4.1 计算起始索引
        int begin = (currentPage-1)*pageSize;
        //4.2 设置模糊查询的格式，在brand属性前后加上%
        String brandName = brand.getBrandName();
        if(brandName != null && brandName.length()>0){
            //如果brandName非空
            brand.setBrandName("%"+brandName+"%");
        }
        String companyName = brand.getCompanyName();
        if(companyName != null && companyName.length()>0){
            //如果companyNameName非空
            brand.setCompanyName("%"+companyName+"%");
        }
        //4.3 查询满足条件的当前页记录
        List<Brand> rows = mapper.selectByPageAndCondition(begin, pageSize, brand);
        //4.4 查询满足条件的总的记录数
        int totalCount = mapper.selectTotalCountByCondition(brand);

        //5、处理结果
        PageBean<Brand> pageBean = new PageBean<>(totalCount,rows);

        //6、关闭资源
        sqlS.close();

        return pageBean;
    }


}
